package top.gangster.lunan.templateservice.controller;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import top.gangster.lunan.resolver.FileNameResolver;
import top.gangster.lunan.result.Result;
import top.gangster.lunan.templateservice.entity.TemplateContract;
import top.gangster.lunan.templateservice.entity.TemplateContractField;
import top.gangster.lunan.templateservice.feign.OSSClient;
import top.gangster.lunan.templateservice.resolver.FileFieldResolver;
import top.gangster.lunan.templateservice.service.TemplateContractService;

/**
 * <p>
 * 合同模板的所有信息 前端控制器
 * </p>
 *
 * @author kid
 * @since 2021-11-06
 */
@RestController
@RequestMapping("/templateservice/contract")
public class TemplateContractController {
	@Autowired
	TemplateContractService templateService;

	@Resource
	OSSClient ossClient;

	/**
	 * 获取所有的合同模板
	 * @return 所有合同模板
	 */
	@GetMapping
	public Result getAllTemplate() {
		List<TemplateContract> list = templateService.list(null);
		return Result.ok().data("templateList",list);
	}

	/**
	 * 获取指定id的合同模板
	 * @param id 合同模板id
	 * @return 指定合同模板
	 */
	@GetMapping("/{id}")
	public Result getTemplate(@PathVariable String id) {
		TemplateContract template = templateService.getById(id);
		return Result.ok().data("template",template);
	}

	/**
	 * 根据模板文件id返回其所有字段
	 * @param id 模板文件id
	 * @return 所有字段
	 */
	@GetMapping("/fields/{id}")
	public Result getFieldsOfTemplate(@PathVariable String id) {
		List<TemplateContractField> fields = templateService.getFieldsByTemplateId(id);
		return Result.ok().data("fields",fields);
	}

	/**
	 * 模糊分页查询
	 * @param current 当前页
	 * @param limit 每页大小
	 * @param name 模糊文件名匹配
	 * @return 分页查询结果
	 */
	@GetMapping("/{current}/{limit}")
	public Result pageQueryTemplate(@PathVariable Long current,@PathVariable Long limit,@RequestParam(required = false) String name) {
		Page<TemplateContract> page = templateService.getTemplate(current, limit, name);
		return Result.ok().data("page",page);
	}

	/**
	 * <h2>该方法应在OSS保存模板文件之后执行</h2>
	 * 解析合同模板，并将解析出的字段（TemplateContractField）封装到合同模板中
	 * @return 合同模板对象
	 */
	@PostMapping("/resolve")
	public Result resolveTemplate(MultipartFile file) {
		List<TemplateContractField> fields = FileFieldResolver.resolveTemplate(file);
		TemplateContract template = new TemplateContract();
		template.setFieldList(fields);
		return Result.ok().data("template",template);
	}

	/**
	 * <h2>该方法应在OSS保存模板文件之后执行</h2>
	 * 保存合同模板文件以及所属字段至数据库
	 * @param template 包含模板字段的合同模板文件
	 * @return Result
	 */
	@PostMapping("/save")
	public Result saveTemplate(@RequestBody TemplateContract template) {
		// 获取合同模板属性
		String id = template.getId();
		List<TemplateContractField> fields = template.getFieldList();

		// 保存模板字段至数据库
		templateService.saveFields(id,fields);

		// 保存模板文件至数据库
		templateService.save(template);

		return Result.ok();
	}


	/**
	 * 根据模板文件id删除模板文件及其所有字段，以及OSS中的合同模板文件
	 * @param id 模板文件id
	 * @return Result
	 */
	@DeleteMapping("/{id}")
	public Result deleteTemplate(@PathVariable String id) {
		// 从OSS中删除模板文件
		TemplateContract template = templateService.getById(id);

		if (template == null) {
			return Result.error().message("不存在id为"+ id + "的模板文件");
		}

		// 获取文件后缀名
		String suffix = FileNameResolver.getFileSuffix(template.getName());
		// 模板文件是以 fileId.suffix 的形式命名的
		ossClient.deleteTemplate(id + suffix);

		// 删除模板文件的所有字段
		templateService.removeFieldsByTemplateId(id);

		// 删除模板文件
		templateService.removeById(id);

		return Result.ok().message("成功删除id为"+ id + "的模板文件");
	}

	/**
	 * 更改指定合同模板
	 * @param template 合同模板
	 * @return update result
	 */
	@PutMapping
	public Result updateTemplate(@RequestBody TemplateContract template) {
		boolean b = templateService.updateById(template);
		if (b) {
			return Result.ok().message("更新合同模板成功");
		}
		return Result.error().message("更新合同模板失败");
	}
}

